package myou.model;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import myou.classes.Emprestimo;
import myou.classes.Interesse;
import myou.classes.Item;
import myou.classes.RequisicaoDeAmizade;
import myou.classes.RequisicaoDeEmprestimo;
import myou.classes.Sessao;
import myou.classes.Sistema;
import myou.classes.Topico;
import myou.classes.Usuario;

/**
 * @author Rony
 *
 */
public class ModuloSistema extends Modulo {

	private static ModuloSistema instance = null;
	private List<Sessao> sessoes;
	private Calendar dataSitema;
	
	/**
	 * Método que retorna uma instancia única da classe
	 * @return Gerente Retorna um Gerente de acordo com o módulo especificado
	 * @throws Exception
	 */
	public synchronized static Modulo getInstance() throws Exception{
		try{
			if(instance == null){
				instance = new ModuloSistema();
			}
			return instance;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
	}
	
	/**
	 * Prepara as listas usadas pelo sistema
	 */
	public void zerarSistema() {
		this.sessoes = new ArrayList<Sessao>();
		this.dataSitema = new GregorianCalendar();
	}

	/**
	 * Destroi as listas usadas internamente pelo sistema
	 */
	public void encerrarSistema() {
		this.sessoes = null;
	}

	/**
	 * Retorna uma sessão com o usuário recuperado a partir do login informado.
	 * 
	 * @param login
	 *            O login a ser pesquisado
	 * @return O id da sessão criada com o usuário recuperado a partir do login
	 *         informado
	 * @throws Exception
	 *             Lança exceção caso login seja nulo, branco ou não exista
	 *             usuário com o login informado
	 */
	public String abrirSessao(String login) throws Exception {
		if (login == null || login.equals("")) {
			throw new Exception("Login inválido");
		}
		Iterator<Usuario> it = this.usuarios.iterator();
		while (it.hasNext()) {
			Usuario usuario = it.next();
			if (usuario.getLogin().equals(login)) {
				
				//criar o repositorio
				
				Sessao sessao = new Sessao(usuario);
				sessoes.add(sessao);
				return sessao.getId();
			}
		}
		throw new Exception("Usuário inexistente");
	}
	
	/**
	 * Localiza uma sessão a partir do id informado
	 * 
	 * @param idSessao
	 *            O id da sessaão
	 * @return retorna a sessão localizada a partir do id
	 */
	public Sessao localizarSessao(String idSessao) {
		Iterator<Sessao> it = this.sessoes.iterator();
		while (it.hasNext()) {
			Sessao sessao = it.next();
			if (sessao.getId().equals(idSessao)) {
				return sessao;
			}
		}
		return null;
	}
}
